﻿using System.Collections.Generic;
using System.Linq;
using AspectIntercept;
using GestorSQL.BusinessEntities;
using GestorSQL.DAO;
using GestorSQL.DAO.InterceptDAO;

namespace GestorSQL.BLL
{
    [Intercept(InterceptAllMethods = true, PreProcesor = typeof(DBTraceProcessor), PostProcesor = typeof(DBTraceProcessor), OmitMethods = new string[] { })]
    public class SecurityManager: InterceptContext 
    {

        #region Variables Privadas
        private IGestorSqlDao dao = new GestorSqlDao();
        
        #endregion

        #region Metodos Publicos
        /// <summary>
        /// Obtiene una lista de Usuarios usuarios que se encuentran activos en el aplicativo
        /// </summary>
        /// <returns>Lista de Usuarios</returns>
        [InterceptOmit]
        public List<UserInRole> GetUsersList()
        {

            return dao.GetUsersList();
        }

        /// <summary>
        /// Obtiene un listado de roles
        /// </summary>
        /// <returns></returns>
        [InterceptOmit]
        public List<Role> GetRoleList()
        {
            return dao.GetRoleList();
        }

        /// <summary>
        /// Obtiene una lista de roles por nombre de usuario
        /// </summary>
        /// <param name="userName"></param>
        /// <returns></returns>
        [InterceptOmit]
        public List<Role> GetRolesByUserName(string userName)
        {
            List<Role> roleList = new List<Role>();
            List<UserInRole> userInRoleList = dao.GetUserInRoleList().Where(x => x.Usuario.Equals(userName.Trim().ToLower())).ToList();

            foreach (UserInRole userInRoleItem in userInRoleList)
                roleList.Add(userInRoleItem.Role);

            return roleList;
        }

        /// <summary>
        /// Verifica si existe el usuario en la base de datos del Gestor SQL
        /// </summary>
        /// <param name="userName"></param>
        /// <returns></returns>
        [InterceptOmit]
        public bool ExistUserOnGestorSQL(string userName)
        {

            if (GetUsersList().Where(x => x.Usuario.Equals(userName.Trim())).Count() > 0)
                return true;
            else
                return false;

        }

        /// <summary>
        /// Guardar un nuevo usuario con sus respectivos roles
        /// </summary>
        /// <param name="userName"></param>
        /// <param name="roles"></param>
        /// <returns></returns>
        public Resultado SaveUserInRole(string userName, List<Role> roles)
        {

            List<Role> roleList = new List<Role>();
            List<UserInRole> userInRoleList = dao.GetUserInRoleList().Where(x => x.Usuario.Equals(userName.Trim().ToLower())).ToList();

            if (userInRoleList.Count() <= 0)
            {
                userInRoleList.Clear();

                userInRoleList = new List<UserInRole>();

                foreach (Role roleItem in roles)
                    userInRoleList.Add(new UserInRole() { Fk_Role = roleItem.IdRole, Usuario = userName });

                return dao.SaveUsersInRoles(userInRoleList);
            }
            else
                return Resultado.Fallido;

        }

        /// <summary>
        /// Actualiza los Roles del usuario 
        /// /// </summary>
        /// <param name="userName"></param>
        /// <param name="roles"></param>
        /// <returns></returns>
        public Resultado UpdateUserInRoles(string userName, List<Role> roles)
        {

            if (dao.DeleteUsersInRole(userName).Equals(Resultado.Exitoso))
                return SaveUserInRole(userName, roles);

            else
                return Resultado.Fallido;


        }
        
        #endregion
    }
}
